﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Abet.Mcp.Modelo.Entidades;
using Abet.Mcp.Modelo.Servicos.Dal;
using log4net;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.IO;
using OfficeOpenXml;

namespace Abet.Mcp.Modelo.Servicos
{
    public static class UsuarioServicos
    {
        private static ILog logger;

        static UsuarioServicos()
        {
            logger = LogManager.GetLogger(typeof(UsuarioServicos));
        }

        public static void Criar(Usuario usuario)
        {
            using (var db = new AbetDb())
            {
                try
                {
                    db.Usuarios.Add(usuario);
                    db.SaveChanges();
                    logger.InfoFormat("Usuario de id {0} criado", usuario.Id);
                }
                catch (Exception ex)
                {
                    logger.Error("Erro ao criar usuário.", ex);
                }
            }
        }

        public static void Excluir(int usuarioId)
        {
            using (var db = new AbetDb())
            {
                var usuario = db.Usuarios.Find(usuarioId);
                db.Usuarios.Remove(usuario);
                db.SaveChanges();
            }
        }

        public static IEnumerable<Usuario> Buscar(string termo)
        {
            using (var db = new AbetDb())
            {
                return (
                    from usuario in db.Usuarios
                    where usuario.Nome.Contains(termo)
                    select usuario)
                    .ToList();
            }
        }

		public static Usuario Obter(int usuarioId)
		{
			using (var db = new AbetDb())
			{
                try
                {
                    return db.Usuarios.Find(usuarioId);
                }
                catch (Exception ex)
                {
                    logger.Error("Erro ao obter usuário.", ex);
                }
			}
            return null;
		}

		public static void Atualizar(Usuario usuario)
		{
			using (var db = new AbetDb())
			{
				db.Usuarios.Attach(usuario);
				DbEntityEntry entry = db.Entry(usuario);
				entry.State = EntityState.Modified;
				db.SaveChanges();
			}
		}

		public static void ImportarExcel(Stream excel)
		{
			using (ExcelPackage package = new ExcelPackage(excel))
			{
				ExcelWorksheet worksheet = package.Workbook.Worksheets[1];

				int first_row = worksheet.Dimension.Start.Row;
				int col_id = worksheet.Dimension.Start.Column;

				int last_row = worksheet.Dimension.End.Row;
				int col_name = col_id + 1; //worksheet.Dimension.End.Column;

				IList<Usuario> usuarios = new List<Usuario>();

				for (int r = first_row; r <= last_row; r++)
				{
					Usuario usuario = new Usuario();
					// usuario.Id = worksheet.Cells[r, col_id].GetValue<int>(); // não fazemos nada com Id aqui... é só criação
					usuario.Nome = worksheet.Cells[r, col_name].GetValue<string>();
					usuarios.Add(usuario);
				}

				using (var db = new AbetDb())
				{
					db.Usuarios.AddRange(usuarios);
					db.SaveChanges();
				}
			}
		}
	}
}